<!-- directive:title 目前最简单的异步方案 -->
<!-- directive:breadcrumb ES6学习笔记 -->
<div class='panel-body'>
    <p>Async/Await应该是目前最简单的异步方案了</p>
        var sleep = function (time) {
            return new Promise(function (resolve, reject) {
                setTimeout(function () {
                    resolve();
                }, time);
            })
        };
        var start = async function () {
            // 在这里使用起来就像同步代码那样直观
            console.log('start');
            await sleep(3000);
            console.log('end');
        };
        start();
    <p>async 表示这是一个async函数，await只能用在这个函数里面。</p>
    <p>await 表示在这里等待promise返回结果了，再继续执行。</p>
    <p>await 后面跟着的应该是一个promise对象（当然，其他返回值也没关系，只是会立即执行，不过那样就没有意义了…）</p>
    <p>await 等待的虽然是promise对象，但不必写.then(..)，直接可以得到返回值。</p>
    <p>既然.then(..)不用写了，那么.catch(..)也不用写，可以直接用标准的try catch语法捕捉错误。</p>
    <script type="text/xian" ui-bs>
        var sleep = function (time) {
            return new Promise(function (resolve, reject) {
                setTimeout(function () {
                    // 模拟出错了，返回 ‘error’
                    reject('error');
                }, time);
            })
        };
        var start = async function () {
            try {
                console.log('start');
                await sleep(3000); // 这里得到了一个返回错误
                // 所以以下代码不会被执行了
                console.log('end');
            } catch (err) {
                console.log(err); // 这里捕捉到错误 `error`
            }
        };
    </script>
    <p>循环多个await</p>
    <p>await看起来就像是同步代码，所以可以理所当然的写在for循环里，不必担心以往需要闭包才能解决的问题。</p>
    <script type="text/xian" ui-bs>
        var start = async function () {
            for (var i = 1; i <= 10; i++) {
                console.log(`当前是第${i}次等待..`);
                await sleep(1000);
            }
        };
    </script>
    <p>值得注意的是，await必须在async函数的上下文中的。</p>
    <script type="text/xian" ui-bs>
        let 一到十 = [1,2,3,4,5,6,7,8,9,10];
        // 错误示范
        一到十.forEach(function (v) {
            console.log(`当前是第${v}次等待..`);
            await sleep(1000); // 错误!! await只能在async函数中运行
        });
        // 正确示范
        for(var v of 一到十) {
            console.log(`当前是第${v}次等待..`);
            await sleep(1000); // 正确, for循环的上下文还在async函数中
        }
    </script>
    <p></p>
    <hr>
</div>
